/*******************************************************************************
* Lempel Ziv Storer Szymanski (LZSS)
*
* File     : lzss.h
* Autore   : Gianluca Costante
*
*******************************************************************************/

#ifndef _LZSS_H
#define _LZSS_H

/*******************************************************************************
*   DEBUG 
*******************************************************************************/
/* simoboli utilizzati per il debug. Commentarli se non si vuole un debug */
#define _MIN_DEBUG_LZSS_
/* #define _DEBUG_LZSS_ */
/* #define _DEEP_DEBUG_LZSS_ */

/*******************************************************************************
*   COSTANTI 
*******************************************************************************/
#define ENCODED 1 /* flag corrispondente al mancato match nella finestra */
#define UNCODED 0 /* flag corrispondente al match nella finestra */

#define OFFSET_BITS 8  /* bits utilizzati per la codifica dell'offset */
#define LENGTH_BITS 8  /* bits utilizzati per la codifica della lunghezza */

#define ONLY_CHAR 1 /* numero di simboli minimi per la corrispondenza */

/* fare uno shift di n posisizioni a sinistra un uno equivale ad avere un numero
 * che rappresenta 2^n */
#define MAX_MATCH ((1 << LENGTH_BITS) - 1)
#define WINDOW_SIZE ((1 << OFFSET_BITS) - 1)

/*******************************************************************************
*   STRUTTURE DATI 
*******************************************************************************/

/* rappresenta la coppia di informazioni da codificare ogni qualvolta si trova 
 * una corrispondenza nella finesta */
typedef struct match{
    
    char undcoded;   /* carattere non codificato (non match nella finestra) */
    int  offset;     /* offset della corrispondenza in finestra */
    int  length;     /* lunghezza della corrispondenza */

} Match;

/*******************************************************************************
*   FUNZIONI
*******************************************************************************/

/*******************************************************************************
*   Funzione    : FindMatchWithBruteforce
*   Descrizione : cerca all'interno della finestra dei simboli la sequenza piu' 
*                 lunga possibile corrispondente ai simboli contenuti nel buffer 
*                 alttraverso un bruteforce  
* 
*   Parametri   : lastW - posizione dell'ultimo simbolo inserito nella finestra
*                 lastL - posizione dell'ultimo simbolo inserito nel buffer
*   Ritorna     : una struttura che contiene offset e length
*******************************************************************************/
Match FindMatch(int lastW, int lastL);

/*******************************************************************************
*   Funzione    : EncodeLZSS
*   Descrizione : legge da un file di input i caratteri e li codifica tramite 
*                 l'algoritmo LZSS scrivendo su un file di output il risultato.
* 
*   Parametri   : inFile  - nome del file da analizzare/comprimere
*                 outFile - nome del file dove scrivere il file compresso
*   Ritorna     : Niente
*******************************************************************************/
void EncodeLZSS(char *inFile, char *outFile);

/*******************************************************************************
*   Funzione    : DncodeLZSS
*   Descrizione : legge come input un file codificato e lo decomprime 
* 
*   Parametri   : inFile  - nome del file da analizzare/decomprimere
*                 outFile - nome del file dove scrivere il file deompresso
*   Ritorna     : Niente
*******************************************************************************/
void DecodeLZSS(char *inFile, char *outFile);

#endif
